#define _POSIX_SOURCE
#define _XOPEN_SOURCE
#ifndef __LIBPCB__
#define __LIBPCB__

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <unistd.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/types.h>
#include "libqueue.h"
#include "libmem.h"
#include "defines.h"
#include "libtabla.h"
#include "libproceso.h"

//Crea un nuevo proceso apartir de un archivo
//Recibe: Path de archivo
//Devuelve: Ok ? Nuevo proceso : NULL
Proceso * nuevoProceso(const char * archivo);

//Procesa una nueva linea de codigo
//Recibe: Puntero a un proceso, el intervalo de tiempo que insume una io y una instrucción cpu y
// un puntero a un entero donde devuelve la cantidad de segundos a esperar por la IO (si es que hay alguna)
//Devuelve: Termino el programa ? 1 : 0	
int procesar(Proceso * p, int ioWait, int cpuWait, int * ret);

//Serializa un proceso
//Recibe: Puntero a proceso y nombre del programa
void serializar(Proceso * p, const char * nombre, char * pathImagen);

//Deserealiza el proceso
//Recibe: Nombre del programa
//Devuelve: OK ? Puntero a un Proceso : NULL
Proceso * deserealizar(const char * nombre, char * pathImagen);

//Calcula el tiempo de servicio esperado
//Recibe: Puntero a proceso y el tiempo que insume una instruccion de cpu
//Devuelve: Tiempo de servicio
int calcularServicio(Proceso * p, int cpuWait);

//Imprime las variables del proceso por salida estándar
//Recibe: Proceso
void imprimirVariablesOut(Proceso * p);

//Imprime las variables en un archivo
//Recibe: Proceso, archivo
void imprimirVariables(Proceso * p, FILE * stream);

//Algoritmo: Highest response ratio next
//Recibe: El proceso a calcular y el tiempo que insume una instruccion de cpu
//Devueve: La tasa de respuesta
int hrrn(Tabla * tabla, int pid1, int pid2, int cpuWait);

//Algoritmo: Shortest remaining time
//Recibe: El proceso a calcular y el tiempo que insume una instruccion de cpu
//Devuelve: El tiempo restante
int spn(Tabla * tabla, int pid1, int pid2, int cpuWait);

//Verifica si el archivo existe
//Recibe: el path del archivo
//Devuelve: OK ? 1 : 0
int fileExist(const char * archivo);

//Obtiene el nombre del archivo
//Recibe: El path del archivo
//Devuelve: El file name
char * getFileName(const char * path);

#endif
